/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.deployment.manager;

import br.com.deployment.entidade.acesso.Usuario;
import br.com.deployment.entidade.selo.Distribuicao;
import br.com.deployment.entidade.selo.Selo;
import br.com.deployment.entidade.selo.TipoSelo;
import br.com.deployment.message.Msg;
import br.com.deployment.servico.DistribuicaoServico;
import br.com.deployment.servico.SeloServico;
import br.com.deployment.servico.TipoSeloServico;
import br.com.deployment.servico.UsuarioServico;
import br.com.deployment.utilitario.DistribuirSelos;
import br.com.deployment.utilitario.ResulDistribuicao;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import org.primefaces.event.SelectEvent;

/**
 *
 * @author elyjr
 */
@ManagedBean
@SessionScoped
public class ManagerDistribuicao implements Serializable {

    @EJB
    private DistribuicaoServico distribuicaoServico;
    @EJB
    private UsuarioServico usuarioServico;
    @EJB
    private SeloServico seloServico;
    @EJB
    private TipoSeloServico tipoSeloServico;
    
    private Distribuicao distribuicao;
    private List<DistribuirSelos> listDistribuirSelo;
    private DistribuirSelos distribuirSelos;
    private Usuario usuario;
    private List<Selo> lstSelosAll;
    private List<ResulDistribuicao> lsRd;
    private List<Distribuicao> listDistribuicao;

    public ManagerDistribuicao() {
    }

    @PostConstruct
    public void init() {

        this.distribuicao = new Distribuicao();
        this.listDistribuirSelo = new ArrayList<DistribuirSelos>();
        this.distribuirSelos = new DistribuirSelos();
        this.lstSelosAll = new ArrayList<Selo>();
        this.lsRd = new ArrayList<ResulDistribuicao>();
        this.listDistribuicao = new ArrayList<Distribuicao>();
        atribuiUsuarioNome();
        Usuario usuario = new Usuario();

    }

    public void reinit() {
        distribuicao = new Distribuicao();
        listDistribuirSelo = new ArrayList<DistribuirSelos>();
        distribuirSelos = new DistribuirSelos();
        lstSelosAll = new ArrayList<Selo>();
        listDistribuicao = new ArrayList<Distribuicao>();
        lsRd = new ArrayList<ResulDistribuicao>(); 
    }

    // Verifica a Quantidade de Selos e se for igual ela atribui
    public boolean verificaQtd() {
        int qtd = distribuirSelos.getQuantidade();
        for (DistribuirSelos dsaux : listDistribuirSelo) {

            if (distribuirSelos.getTipoSelo().getId() == dsaux.getTipoSelo().getId()) {
                System.err.println("achou" + dsaux);
                qtd += dsaux.getQuantidade();
                System.err.println("achou qtd" + qtd);
            }
        }
        System.err.println(qtd);
        return distribuicaoServico.containsSelo(distribuirSelos.getTipoSelo(), qtd);
    }

    public void addList() {
        boolean add = true;
        if (verificaQtd()) {
            for (DistribuirSelos ds : listDistribuirSelo) {
                if (distribuirSelos.getTipoSelo().getId() == ds.getTipoSelo().getId()) {
                    ds.setQuantidade(ds.getQuantidade() + distribuirSelos.getQuantidade());
                    listDistribuirSelo.set(listDistribuirSelo.indexOf(ds), ds);
                    add = false;
                    break;
                }
            }
            if (add) {
                distribuirSelos.setTipoSelo(tipoSeloServico.find(distribuirSelos.getTipoSelo().getId()));
                listDistribuirSelo.add(distribuirSelos);
            }
            distribuirSelos = new DistribuirSelos();
        } else {
            Msg.messagemWarn("Não possui selos suficientes no estoque");
        }
    }

    public void remove(DistribuirSelos ds) {
        listDistribuirSelo.remove(ds);
    }

    public void editar(DistribuirSelos ds) {
        distribuirSelos = ds;
        listDistribuirSelo.remove(ds);
    }

    public void atribuiUsuarioNome() {
        try {
            usuario = usuarioServico.verificarUsuarioNome(FacesContext.getCurrentInstance().getExternalContext().getUserPrincipal().getName());
        } catch (Exception e) {
            Msg.messagemWarn("Para atribuir Selos efetue o Login");

        }
    }

    public void distribuir() {
        List<Selo> lstSelos = new ArrayList<Selo>();
        ResulDistribuicao rd = new ResulDistribuicao();
        for (DistribuirSelos dselo : listDistribuirSelo) {
            rd.setTipoSelo(dselo.getTipoSelo());
            lstSelos = distribuicaoServico.atribuirSelos(dselo.getTipoSelo(), dselo.getQuantidade());
            rd.setSelo(lstSelos);
            lsRd.add(rd);
            rd = new ResulDistribuicao();
            if (!lstSelos.isEmpty()) {
                for (Selo selo : lstSelos) {
                    selo.setDistribuido(true);
                   
                    lstSelosAll.add(selo);
                }
            } else {
                Msg.messagemInfo("Distribuição Incompleta, não possui selos no estoque!");
            }
        }
      
        System.err.println("lstSelosAll");
        if (!lstSelosAll.isEmpty()) {
            org.primefaces.context.RequestContext.getCurrentInstance().execute("dialog.show();");
        } else {
            Msg.messagemWarn("Resumo da Distribuição está vazia");
        }
    }

    public void salvarDistribuicao() {
        
        seloServico.editSelos(lstSelosAll);
        
        distribuicao.setExecutante(usuario);
        distribuicao.setListSelo(lstSelosAll);
        distribuicaoServico.create(distribuicao);
        reinit();
        Msg.messagemInfo("Distribuição completa com Sucesso");
    }
    
     public void redirect(String string) {
        try {
            FacesContext context = FacesContext.getCurrentInstance();
            reinit();
            context.getExternalContext().redirect(string);
        } catch (IOException ex) {
            Logger.getLogger(ManagerDistribuicao.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void handleSelect(SelectEvent event) {
        Usuario usuario = (Usuario) event.getObject();
        distribuicao.setRecebedor(usuarioServico.find(usuario.getId()));
    }

    public void handleSelectTipoSelo(SelectEvent event) {
        TipoSelo tipoSelo = (TipoSelo) event.getObject();
        distribuirSelos.setTipoSelo(tipoSelo);

    }

    public void limpaDistribuir() {
        distribuirSelos.setQuantidade(0);
        distribuirSelos = new DistribuirSelos();
    }

    public List<ResulDistribuicao> getLsRd() {
        return lsRd;
    }

    public void setLsRd(List<ResulDistribuicao> lsRd) {
        this.lsRd = lsRd;
    }

    public List<Selo> getLstSelosAll() {
        return lstSelosAll;
    }

    public void setLstSelosAll(List<Selo> lstSelosAll) {
        this.lstSelosAll = lstSelosAll;
    }

    public Usuario getUsuario() {
        return usuario;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }

    public Distribuicao getDistribuicao() {
        return distribuicao;
    }

    public void setDistribuicao(Distribuicao distribuicao) {
        this.distribuicao = distribuicao;
    }

    public List<DistribuirSelos> getListDistribuirSelo() {
        return listDistribuirSelo;
    }

    public void setListDistribuirSelo(List<DistribuirSelos> listDistribuirSelo) {
        this.listDistribuirSelo = listDistribuirSelo;
    }

    public DistribuirSelos getDistribuirSelos() {
        return distribuirSelos;
    }

    public void setDistribuirSelos(DistribuirSelos distribuirSelos) {
        this.distribuirSelos = distribuirSelos;
    }

    public void limpaList() {
        listDistribuirSelo = new ArrayList<DistribuirSelos>();
    }
}
